package com.udima.reglocation;

import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import com.google.gson.Gson;
import com.udima.reglocation.rest.RestUser;
import com.udima.reglocation.rest.RestUserSession;
import com.udima.reglocation.util.AsyncTaskCompleteListener;
import com.udima.reglocation.util.HttpAsyncTask;

/**
 * Clase que implementa el formulario de login
 * 		-Login:
 * 		-Logout:
 * 
 * @author luis
 *
 */

public class LoginActivity extends Activity implements AsyncTaskCompleteListener{

	private Activity activity=this;
	private TextView lblGotoRegister;
	private Button btnLogin;
	private Button btnLogout;
	private EditText inputUser;
	private EditText inputPassword;
	private static TextView loginErrorMsg;
	
	/**
	 * En la creación de la clase se instancian los objetos del formulario y se crean las funciones de escucha
	 * para los botones de login y logout
	 */
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login_activity);
		
		inputUser     = (EditText) findViewById(R.id.txtUser);
		inputPassword = (EditText) findViewById(R.id.txtPass);
		btnLogin      = (Button)   findViewById(R.id.btnLogin);
		btnLogout     = (Button)   findViewById(R.id.btnLogout);
		loginErrorMsg = (TextView) findViewById(R.id.login_error);

		/**
		 * Listener del boton login
		 */
		btnLogin.setOnClickListener(new View.OnClickListener() {

			public void onClick(View view) {
				
				// Instancia a SharedPreferences
			    SharedPreferences pref = getApplicationContext().getSharedPreferences("com.udima.reglocation", MODE_PRIVATE);
			    
				//Asignación de valores a la clase "restUsuario"
				RestUser restUsuario = new RestUser();
				restUsuario.setUserName(inputUser.getText().toString());
				restUsuario.setPassword(inputPassword.getText().toString());
				
				//Serialización de la clase en formato Json dentro de la cadena "loginUsuario"
				Gson gson = new Gson();
				String loginUsuario = gson.toJson(restUsuario);

				//Definición del callback particular al envio de parámetros del login 
				final AsyncTaskCompleteListener callback = new AsyncTaskCompleteListener() {

					@Override
					public void onTaskComplete(String result) {

						//Primero se transforma el resultado a un objeto Json
						try {
							JSONObject json = new JSONObject(result);
							
							//Se muestra el mesaje del resultado del login generado por el servidor
							if(json.getString("responseSuccessful")=="true"){
								
								JSONObject jsonUserSession = json.getJSONObject("userSession");
								
								loginErrorMsg.setText("Login correcto! Usuario:" + jsonUserSession.getString("userId"));
								
								// Creación de SharedPreferences
							    SharedPreferences pref = getApplicationContext().getSharedPreferences("com.udima.reglocation", MODE_PRIVATE); 
							    Editor editor = pref.edit();
							 
							    //Almacenamiento del id del usuario y el token de la sesión en las SharedPreferences 
							    editor.putString("userId",       jsonUserSession.getString("userId"));
							    editor.putString("sessionToken", jsonUserSession.getString("sessionToken"));
							    editor.putString("lastTimeUsed", jsonUserSession.getString("lastTimeUsed"));
							     
							    // Guardado de los cambios en  SharedPreferences
							    editor.commit(); // commit changes
								
								//Se redirecciona la actividad a la siguiente pantalla de menú de la aplicación
								Intent itemintent = new Intent(LoginActivity.this, TrackMenuActivity.class);
								LoginActivity.this.startActivity(itemintent);
							}
							else{
								loginErrorMsg.setText("Error:" + json.getString("responseErrors"));
							}
						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						
					}
		        };
				
				//Ejecución de la consulta al servicio rest de login
				new HttpAsyncTask(activity) {

		            @Override
		            protected void onPostExecute(String result) {
		                super.onPostExecute(result);
		                callback.onTaskComplete(result);
		            }
		        }.execute(pref.getString("appBaseUrl",null) + "/rest/users/login/",loginUsuario);
				
				
			}
		});
		
		/**
		 * Listener del boton logout
		 */
		btnLogout.setOnClickListener(new View.OnClickListener() {

			public void onClick(View view) {
				
				// Instancia a SharedPreferences
			    SharedPreferences pref = getApplicationContext().getSharedPreferences("com.udima.reglocation", MODE_PRIVATE); 
				
				//Asignación de valores a la clase "restUserSession"
				RestUserSession restUserSession = new RestUserSession();
				restUserSession.setUserId(pref.getString("userId",null));
				restUserSession.setSessionToken(pref.getString("sessionToken",null));
				
				//Serialización de la clase en formato Json dentro de la cadena "logoutUsuario"
				Gson gson = new Gson();
				String logoutUsuario = "{\"userSession\":"+gson.toJson(restUserSession)+"}";
				
				//Definición del callback particular al envio de parámetros del logout
				final AsyncTaskCompleteListener callback = new AsyncTaskCompleteListener() {

					@Override
					public void onTaskComplete(String result) {
						
						
						Log.i("ServicioRest",result);
						//Primero se transforma el resultado a un objeto Json
						try {
							JSONObject json = new JSONObject(result);
							
							//Se muestra el mesaje del resultado del login generado por el servidor
							if(json.getString("responseSuccessful")=="true"){
								loginErrorMsg.setText("Logout correcto!");
							}
							else{
								loginErrorMsg.setText("Error en logout:" + json.getString("responseErrors"));
							}
						} catch (JSONException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						
					}
		        };
		        
				//Ejecución de la consulta al servicio rest de logout
				new HttpAsyncTask(activity) {
		            @Override
		            protected void onPostExecute(String result) {
		                super.onPostExecute(result);
		                callback.onTaskComplete(result);
		            }
		        }.execute(pref.getString("appBaseUrl",null) + "/rest/users/logout/",logoutUsuario);
			}
		});

		lblGotoRegister = (TextView) findViewById(R.id.gps_status);
		lblGotoRegister.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				Intent itemintent = new Intent(LoginActivity.this,RegisterActivity.class);
				LoginActivity.this.startActivity(itemintent);
			}
		});
	}

	@Override
	public void onTaskComplete(String result) {
		
		
	}

}